package control;

import java.util.Hashtable;
import java.util.LinkedList;

public class Tipo {
	
	public final static int INT  =0;
	public final static int CHAR =1;
	public final static int BOOLEAN =2;
	public final static int STRUCT =3;
	public final static int VOID =3;
	public final static int OTRO =4;
	/**
	 * Define si es un tipo básico o un struct
	 */
	private int tipo;
	
	private int size;
	
	public boolean esMetodo;
	
	public String nombre;
	/**
	 * Si es struct define de qué tipos se compone
	 */
	private Hashtable<String,Tipo> hijos;
	private LinkedList<Tipo> parametros;
	
	
	public Tipo( int tipo,int size){
		this.tipo = tipo; 
		this.size = size;
		hijos = new Hashtable<String, Tipo>();
		parametros = null;
	}
	
	public Tipo(int tipo){
		this.tipo = tipo; 
		this.size = 1;
		hijos = new Hashtable<String, Tipo>();
		parametros = null;
	}
	
	public int darTipo(){
		return tipo;
	}
	
	public void darNombre(String nombre){
		this.nombre = nombre;
	}
	
	public void definirTipo(int tipo) {
		this.tipo = tipo;
	}
	public boolean agregarHijo(Tipo hijo, String nombre){
		if (tipo==3)
			if (hijos.get(nombre)==null){
				hijos.put(nombre, hijo);
				return true;
			}
		return false;
	}
	
	public boolean agregarParametro(Tipo parametro){
		if(esMetodo){
			parametros.add(parametro);
			return true;
		}
		return false;
	}
	
	public Tipo encontrarParametro(int indice){
		if (indice<parametros.size())
			return parametros.get(indice);
		else return null;
	}
	
	public void size(int size){
		this.size = size;
	}
	public void metodo(){
		esMetodo = true;
		parametros = new LinkedList<Tipo>();
		hijos = null;
	}
	
	public Hashtable<String,Tipo> darHijos(){
		return hijos;
	}

}
